package threading;

/**
 * 使用多线程, 会有一定的优势: 能充分利用多核CPU,提高程序的效率
 *
 * 写个代码验证下, 看看能不能提高以及提高多少效率 !!
 */
public class TestDemo6 {

    public static final long COUNT = 100_0000_0000L; // 100亿

    public static void main(String[] args) {
        serial();
        concurrency();
    }

    //串行执行任务
    public static void serial() {
        // 记录 ms 级别的时间戳, 返回值是 long 类型
        long beg = System.currentTimeMillis();

        long a = 0;
        for (long i = 0; i < COUNT; i++) {
            a++;
        }
        a = 0;
        for (long i = 0; i < COUNT; i++) {
            a++;
        }
        long end = System.currentTimeMillis();

        System.out.println("串行执行任务执行时间 " + (end - beg) + " ms");
    }

    // 并发执行任务
    public static void concurrency() {
        long beg = System.currentTimeMillis();

        Thread thread = new Thread(() -> {
            long a = 0;
            for (long i = 0; i < COUNT; i++) {
                a++;
            }
        });

        Thread thread2 = new Thread(() -> {
            long a = 0;
            for (long i = 0; i < COUNT; i++) {
                a++;
            }
        });

        thread.start();
        thread2.start();

        // 此时代码存在一个问题 :
        // 这里有三个进程 : thread, thread2, 和 main, 并发执行( 各执行各自的 )
        // 当main执行完 thread.start(), thread2.start() 会继续往后走, 计算结束时间
        // 但是当 thread, thread2 还没执行完就计算结束时间 这合理嘛 ?? 不合理 !!!!
        // 应让 main 线程等待 thread, thread2 线程执行完再计算结束时间 才合理 !!
        // 因此可如下处理 :

        try {
            thread.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // main 中调用 thread.join() 效果就是让 main 线程阻塞, 直到thread 线程结束
        // 再执行 main 线程!!! main 中调用 thread.join() 效果类似.
        // 注意: thread,thread2 是并发执行(宏观上的同时执行),而不是先执行thread, 再执行thread2 !!!

        long end = System.currentTimeMillis();
        System.out.println("并发执行任务执行时间 " + (end - beg) + " ms");

    }
}
